package bdsimple.impl.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.CiudadDAO;
import bdsimple.dao.base.CiudadVampiroDAO;
import bdsimple.dao.base.VampiroDAO;
import bdsimple.dto.base.CiudadDTO;
import bdsimple.dto.base.CiudadVampiroDTO;
import bdsimple.dto.base.VampiroDTO;
import dao.base.api.IDTO;
import dao.base.impl.Reference;

public class CiudadVampiroDAOImpl extends MySQLBaseDAO implements CiudadVampiroDAO {

	public CiudadVampiroDAOImpl() {
		super(CiudadVampiroDTO.class);
	}
	
	// --------------------------------------------------------------------------------

	@Override
	protected String createInsertCollst(IDTO dto) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadVampiroDTOImpl.PROBABILIDAD_HORDAS);
		strbuf.append(", ");
		strbuf.append(CiudadVampiroDTOImpl.CIUDAD_REFERENCE);
		strbuf.append(", ");
		strbuf.append(CiudadVampiroDTOImpl.VAMPIRO_REFERENCE);

		return strbuf.toString();

	}
	
	// --------------------------------------------------------------------------------

	@Override
	protected String createInsertValues(IDTO dto) throws Exception {

		CiudadVampiroDTOImpl ciudadVampiroDTOImpl = (CiudadVampiroDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();
		
		strbuf.append(ciudadVampiroDTOImpl.getProbabilidadHordas());
		strbuf.append(",");

		Reference<CiudadDTO> ref = ciudadVampiroDTOImpl.getCiudadDTORef();
		ref.checkInsert();
		strbuf.append(ref.getIdAsString());
		
		strbuf.append(",");

		Reference<VampiroDTO> ref1 = ciudadVampiroDTOImpl.getVampiroDTORef();
		ref1.checkInsert();
		strbuf.append(ref1.getIdAsString());

		return strbuf.toString();

	}
	
	// --------------------------------------------------------------------------------

	@Override
	protected String createTableColumns() throws Exception {

		StringBuffer strbuf = new StringBuffer();

		VampiroDAO vampiroDAO = (VampiroDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				VampiroDAO.class, connectionBean);

		CiudadDAO ciudadDAO = (CiudadDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				CiudadDAO.class, connectionBean);

		strbuf.append(CiudadVampiroDTOImpl.ID);
		strbuf.append(" INT PRIMARY KEY AUTO_INCREMENT, ");
		strbuf.append(CiudadVampiroDTOImpl.PROBABILIDAD_HORDAS);
		strbuf.append(" FLOAT, ");
		strbuf.append(CiudadVampiroDTOImpl.CIUDAD_REFERENCE);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		strbuf.append(",");
		strbuf.append(CiudadVampiroDTOImpl.VAMPIRO_REFERENCE);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(vampiroDAO.getTableName());

		return strbuf.toString();

	}
	
	// --------------------------------------------------------------------------------

	@Override
	protected String createUpdateValues(IDTO dto) throws Exception {

		CiudadVampiroDTOImpl ciudadVampiroDTOImpl = (CiudadVampiroDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadVampiroDTOImpl.PROBABILIDAD_HORDAS);
		strbuf.append(" = ");
		strbuf.append(ciudadVampiroDTOImpl.getProbabilidadHordas());

		strbuf.append(", ");

		strbuf.append(CiudadVampiroDTOImpl.CIUDAD_REFERENCE);
		strbuf.append(" = ");
		
		Reference<CiudadDTO> ref = ciudadVampiroDTOImpl.getCiudadDTORef();
		ref.checkUpdate();
		strbuf.append(ref.getIdAsString());
		
		strbuf.append(", ");

		strbuf.append(CiudadVampiroDTOImpl.VAMPIRO_REFERENCE);
		strbuf.append(" = ");
		
		Reference<VampiroDTO> ref1 = ciudadVampiroDTOImpl.getVampiroDTORef();
		ref1.checkUpdate();
		strbuf.append(ref1.getIdAsString());

		return strbuf.toString();

	}
	
	// --------------------------------------------------------------------------------

	@Override
	protected IDTO internalResultSetToDTO(ResultSet rs, IDTO dto)
			throws Exception {

		CiudadVampiroDTOImpl ret = (CiudadVampiroDTOImpl) dto;
		
		ret.setId(rs.getInt(CiudadVampiroDTO.ID));

		ret.setProbabilidadHordas(rs
				.getFloat(CiudadVampiroDTOImpl.PROBABILIDAD_HORDAS));
		
		Reference<CiudadDTO> ref = ret.getCiudadDTORef();
		ref.setRefIdent(rs.getInt(CiudadVampiroDTO.CIUDAD_REFERENCE));
		ref.setRefValue(null);
		
		Reference<VampiroDTO> ref1 = ret.getVampiroDTORef();
		ref1.setRefIdent(rs.getInt(CiudadVampiroDTO.VAMPIRO_REFERENCE));
		ref1.setRefValue(null);
		

		return ret;

	}

	// --------------------------------------------------------------------------------

	@Override
	public List<IDTO> listAll(int lim, int off) throws Exception {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	// --------------------------------------------------------------------------------

	public List<IDTO> listBy(String key, Object val) //
			throws Exception {

		if (key == null || val == null) {
			throw new IllegalArgumentException("key == null || val == null");
		}

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(key);
		strbuf.append(" = ");
		strbuf.append(val);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}
	
	public CiudadVampiroDTO loadByVampiroIdCiudadId(int vampiroId, int ciudadId) throws SQLException,Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadVampiroDTO.CIUDAD_REFERENCE);
		strbuf.append(" = ");
		strbuf.append(ciudadId);
		strbuf.append(" AND ");
		strbuf.append(CiudadVampiroDTO.VAMPIRO_REFERENCE);
		strbuf.append(" = ");
		strbuf.append(vampiroId);

		System.err.println(strbuf.toString());

		ResultSet rs = //
			connection.createStatement().executeQuery(strbuf.toString());

		if (rs.next()) {
			return (CiudadVampiroDTO) resultSetToDTO(rs);
		}

		return null;
	}
	
	public List<CiudadVampiroDTO> listByVampiroId(int id) throws SQLException, Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadVampiroDTO.VAMPIRO_REFERENCE);
		strbuf.append(" = ");
		strbuf.append(id);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<CiudadVampiroDTO> ret = new ArrayList<CiudadVampiroDTO>();

		while (rs.next()) {
			ret.add((CiudadVampiroDTO) resultSetToDTO(rs));
		}

		return ret;
	}
	

}
